home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
9509
/
TCL.CD
< prev
next >
Wrap
Text File
|
1996-03-10
|
17KB
|
345 lines
@VX Window grafikus alkalmazások fejlesztése Tcl/Tk
@Vnyelven@N
@VTcl-ben egyszerûbb!@N
X Window alá alapvetôen C nyelven írhatunk programokat
-- de ez egyáltalán nem egyszerû. Egyszerûbb programok
fejlesztéséhez találták ki a Tcl/Tk nyelvet, amit akár az X
Window Basicjének is nevezhetünk.
Az alábbiakban meg szeretnénk mutatni a Tcl/Tk
alkalmazások fejlesztésének alapjait, és kedvet szeretnénk
csinálni további programokhoz néhány ötletes példaalkalmazás
bemutatásával. Az alább leírtak feltételezik, hogy a Tcl/Tk
csomag már feltelepült a Unix rendszerünk alá, és van egy X
Window alkalmazások megjelenítésére képes terminálunk.
A rendszer kitalálói elôször egy általános célú script
nyelv alapjait teremtették meg, amit Tcl-nek, ""tool command
languange"-nek neveztek el. A késôbbiek során ehhez
készítettek kiterjesztéseket, például a grafikus
kezelôfelületek létrehozására alkalmas Tk kiterjesztést,
amely egy toolkit az X Window rendszerhez.
@VIsmerkedés@N
A Tclben írt alkalmazásokat egy @Ktclsh@N nevû
scriptértelmezô shellel tudjuk lefuttatni. Ha interaktívan
szeretnénk kipróbálni a Tcl lehetôségeit, indítsuk el a
tclsh programot paraméter nélkül. A kapott promptba Tcl
parancsokat gépelhetünk. Indulásként írjuk be a következô
parancsot:
@Kexpr 4 + 4@N
A parancs hatására a tclsh kiértékeli a megadott
kifejezést, kiírja a végeredményt, és kiad egy újabb
promptot a következô parancs számára. E példából sokat
megtanulhatunk a Tcl parancsok felépítésérôl. A parancs
részeit szóköz karakterek választják el. Az elsô szó a
parancs, utána felsoroljuk a hozzá tartozó paramétereket.
Persze ennél bonyolultabb mûveleteket is végezhetünk a Tcl
segítségével. Gépeljük be a következô parancsot:
@Kexpr (3 > 4 ) || ( 6 <= 7 )@N
Ez egy logikai kifejezés, a *Y**Y* jel az OR mûveletet
jelöli. A kifejezés eredménye egy logikai érték.
A tclsh-ból az exit paranccsal léphetünk ki.
@VVáltozók, eljárások@N
A Tclben képesek vagyunk különbözô adatokat változókba
írni és ezeket kifejezésekbe behelyettesíteni. A változóknak
a set paranccsal tudunk értéket adni:
@Kset a 44@N
Egy változóra $változónév módon hivatkozhatunk:
@Kexpr $a * 4@N
A Tcl rendelkezik egy alap eljáráskészlettel, amit saját
eljárásokkal bôvíthetünk.
Az 1. példa eljárása egy hatványozást végzô függvényt
valósít meg. Láthatjuk, hogy a @Kproc@N utasítás elsô paramétere
az újonnan definiált utasítás neve, ezt követik a
paraméterei kapcsos zárójelbe zárva, majd egy következô
kapcsos zárójelben a végrehajtandó utasítások. A @Kreturn
$változó@N utasítással adhatunk vissza értéket a függvény
visszatérésekor.
A Tcl nyelvben is vannak globális és lokális változók.
Egy függvényen belül definiált változó lokális az adott
függvényre nézve, és globális a beágyazott függvényekre
nézve.
@VSpecialitások@N
A Tcl sokban eltér más programozási nyelvektôl. Például
a C programozási nyelvben fenntartott szavak vannak, melyek
az utasítások teljes szintaxisát és belsô felépítését is
definiálják. A Tclben nincs rögzített nyelvtan, hanem egy
scriptértelmezô fut végig a Tcl utasításokon és eljárásokon.
Az értelmezô mûködése és szabályai rögzítettek, de bármikor
definiálhatunk új utasításokat, vagy ""felüldefiniálhatjuk"
a régieket.
A ciklusokat, eljárásokat és kifejezéseket
utasításokként implementálhatjuk, a Tcl alapvetôen nem
kezeli ezeket a struktúrákat. Nézzük meg például az elôzô
példában a ciklus kialakítását!
@VA Tk nyelv alapvetô használata@N
Bár a Tcl tartalmaz egy széles körû utasításcsomagot,
nem önálló felhasználásra fejlesztették, hanem más
alkalmazásspecifikus kiegészítô utasításcsomagokkal
támogatott programok fejlesztésére. Ezek közül a
legérdekesebb talán a Tk csomag, amely egy X Window toolkit,
Tcl utasítások formájában megírva.
Azt a programot, amely a Tk kiegészítést használó Tcl
alkalmazásokat is futtatni tudja, @Kwish@N-nek hívják. Ha
interaktívan szeretnénk játszani a Tk kiegészítéssel, adjuk
ki a @Kwish@N parancsot paraméter nélkül! Ennek hatására már
nemcsak egy Tcl promptot kapunk, hanem egy grafikus ablak is
nyílik, amiben az általunk késôbb megadott elemek fognak
megjelenni. Elsô lépésként gépeljük be 2. példaprogramot,
eredményeként ezt láthatjuk:
@<9509\HELLOWO.GIF>■■@N 1. ábra
Több dolog is magyarázatra szorul ebben a scriptben.
Elôször is a @Kbutton@N és a @Kpack@N utasítás. Mindkettô a Tk-ban
van implementálva. Az utasítások felépítése és értelmezése
pontosan az elôzô fejezetben leírt Tcl értelmezés szerint
mûködik itt is.
A Tk utasítások megértéséhez meg kell ismerkedni az X
Window rendszer és az X Window alkalmazások felépítésével.
A grafikus kezelôfelület alapegysége a @Kwidget@N (window
gadget, azaz ablak-szerkentyû). A widget egy ablak, amelynek
definiált megjelenése és viselkedése van. A widgeteket
osztályokra oszthatjuk: például button (nyomógomb), menu,
scrollbar (görgetôsáv). Az azonos osztályba tartozó widgetek
megjelenése és viselkedése azonos. Például minden button
widget megjelenít egy szöveget vagy bitmapet, és végrehajt
egy utasítást, ha rákattintottak az egérrel.
Az egy alkalmazáson belüli widgetek egy hierarchikus fa
struktúrába vannak szervezve. Az alkalmazás fô ablakát
""."-nak hívják. Az összes ezen belül megjelenô ablak ennek
az ablaknak a gyereke. Az egyes widgeteket a fôablakból
származtatva, az összes szülôt megadva határozhatjuk meg. A
szülôket ponttal választjuk el egymástól. A fenti példában a
.gomb widget a fôablakból leszármazott gomb nevû widgetet
jelöli. A @K.a.b.c@N widget a fô ablakban lévô @Ka@N-ból származó @Kb@N
widget @Kc@N nevû gyereke.
Minden widget létrehozásához tartozik egy utasítás és
ennek paraméterei, amelyek a widget konfigurációját
határozzák meg. Ezen opciók közül nem kell mindet megadni,
nagy részüknél használhatjuk az alapbeállításokat. A @Kbutton@N
utasítás erre példa: megadtuk vele, milyen osztályba sorolt
widgetet szeretnénk létrehozni, és a paraméterekkel az adott
widget konfigurációját állítottuk be. A @Kpack@N utasítás
hatására a widget megjelenik a képernyôn (a widget a
létrehozásakor még nem jelenik meg).
A megjelenítéssel kapcsolatos az entitások egy független
csoportja: a geometriai vezérlôk. A geometriai vezérlôk
jelenítik meg, helyezik el és méretezik a widgeteket. A pack
utasítás például egy ilyen geometriai vezérlônek küld
parancsot a widget megjelenítésére.
@VEsemények@N
Az egyes widgetekkel kapcsolatos eseményekhez általában
utasításokat rendelhetünk. Ilyen esemény lehet az egér adott
gombjának lenyomása vagy felengedése, valamelyik billentyû
lenyomása vagy elengedése.
A 3. példa az elôbbi hatványozási feladat grafikus
kezelôfelületének megvalósítása:
@<9509\POWER.GIF>■■@N 2. ábra
Ebben az alkalmazásban 5 widgetet hozunk létre, ezek
közül kettô szolgál az adatok bevitelére @K(entry)@N, kettô fix
szöveget jelez ki, és egy jelzi az eredményt dinamikusan
@K(label)@N. A két beviteli mezôben a [Return] gomb lenyomására
végrehajtódik a megfelelô bind után megadott utasítás.
@VTovábbi példák@N
A fenti egyszerû példák során megismerkedhettünk a
@Kbutton@N és a @Klabel@N widgettel. A Tk-ban persze ennél jóval
több elôredefininált widget van, néhányuk felhasználásával
szeretném bemutatni e programozási eszköz elônyeit és
tulajdonságait.
A 4. program egy menüsor és a görgetôsávos listák
kezelését hivatott bemutatni. A program egy listát tölt fel
az aktuális alkönyvtárbeli file-ok neveivel.
@<9509\LISTA.GIF>■■@N 3. ábra
A menüsort a @Kframe@N utasítással hozzuk létre. A @Kframe@N
gyermekeiként hozzuk létre a menü elemeit, így azon belül
fognak elhelyezkedni. Az eseményeket csak késôbb rendeljük
hozzájuk, most csak a paramétereket állítjuk be. A listát
egy @Klistbox@N és egy @Kscrollbar@N widget segítségével hozzuk
létre. Ezeket a fentiek szerint kell egymáshoz rendelnünk, a
megfelelô mûködés érdekében. A file-listázó menüponthoz
négysoros Tcl scriptet, míg a @KQuit@N gombhoz egyszerû @Kexit@N
utasítást rendeltünk. Végül a már ismert @Kpack@N utasítással
megjelenítjük a létrehozott widgeteket. A példaprogramból
megismerhetjük a @Kpack@N utasítás néhány specialitását,
melyekkel különbözô irányokba rendezhetjük a widgetet, vagy
megadhatjuk, milyen irányban töltsék ki az ablakot.
Az 5. példaprogramban a grafikus alkalmazások egy másik
gyakran elôforduló elemét, a radiobuttont (kiválasztógombot)
mutatom be:
@<9509\SETFONT.GIF>■■@N 4. ábra
Az ablakban megjelenô gombok közül mindig csak egyet
választhatunk ki, és ez adott esetben egy font-típust ad
vissza. A legfelsô sorban egy minta szöveg található,
amelyre a jobb gombbal kattintva a betûk típusát állíthatjuk
be, a bal gombra pedig kilépünk a programból.
@VBeszerzés, szakirodalom@N
A teljes Tcl és Tk csomagot az @Kftp.cs.berkeley.edu@N nevû
anonymous ftp szerverrôl ftp-zhetjük le. A Tcl a
@K/ucb/tcl/tcl7.3.tar.Z@N file-ban, a Tk a @K/ucb/tcl/tk3.6.tar.Z@N
file-ban található. Ugyanebben az alkönyvtárban találhatunk
példaprogramokat és a készülô új programverziók béta
példányait. A Linux aktuális Slackware csomagjában is
megtalálható a többé-kevésbé legfrissebb verzió.
A Tcl és a Tk nyelv mélyebb megismeréséhez a fejlesztô
által írt könyvet ajánlom: @KJohn K. Ousterhout: Tcl and the
TK Toolkit. Addison-Wesley Publishing Company, 1994.@N
@VKiegészítések a Tcl és Tk nyelvhez@N
Az @Kexpect@N az egyik legrégebbi Tcl alkalmazás, de egyben
a legközkedveltebb is. A program képes interaktívan
beszélgetni más programokkal. Olyan scriptet lehet írni,
amely megadott bemenetre vár, és ha megkapta, válaszol
valamit vagy meghív egy másik programot. Ilyen szekvenciát
tetszôleges hosszan definiálhatunk.
Az @KExtended Tcl@N (TclX) bôvítései:
@V*@N újabb Posix rendszerhívások és függvények érhetôk el
@V*@N az @Kawk@N program funkciójához hasonló file-feldolgozó
lehetôségek
@V*@N kulcsos listák, C struktúrákhoz hasonló lehetôségek
@V*@N idô- és dátum-manipuláló és -konvertáló programok
@V*@N on-line súgó
@V*@N debugger és programfejlesztési környezet.
Az @KXF@N nagyban megkönnyíti a Tcl/Tk alkalmazások
fejlesztését, azzal hogy grafikus felületet biztosít a
kezelôfelületünk kialakításához, azaz a widgetek
elkészítéséhez és paraméterezéséhez. Érdekessége, hogy a
fejlesztés alatt álló Tcl/Tk alkalmazás egyfolytában él, így
az összes változtatás azonnal megjelenik a képernyônkön.
Tartalmazza a szükséges menüpontokat az ablakok
létrehozására, és késôbbi átkonfigurálására. Lehetôséget ad
az esemény-hozzárendelések egyszerû beállítására. Az XF
tartalmazza az összes eredeti widget osztályt és lehetôséget
ad újak definiálására. Támogatja a legtöbb Tcl és Tk
kiegészítést, maga az XF is egy Tcl/Tk alkalmazás.
A @KTcl-DP@N lehetôséget ad elosztott alkalmazások
fejlesztésére. Legfontosabb szolgáltatása az RPC (remote
procedure call) támogatás. Egy alkalmazást több részre
bontva futtathatunk vele különbözô gépeken, és ezek
hálózaton kommunikálhatnak egymással.
Az @KAk@N audio kiterjesztés a Tclhez. A kiegészítés az
AudioFile nevû szabványra épül, amely hálózatfüggetlen,
hangkártya-független audio rendszer, s több platformon is
rendelkezésre áll. Az @KAk@Nval ki tudunk adni olyan Tcl
utasításokat, amelyek audio file visszajátszását,
felvételét, telefonvezérlést és szinkronizációt valósítanak
meg.
@KSára Endre (endre@@carenet.hu)@N
@V1. példa: egy egyszerû eljárás@N
proc power {base p} {
set result 1
while ($p > 0) {
set result [expr $result * $base]
set p [exprt $p-1]
}
return $result
}
@V2. példa: szöveg az ablakban
button .gomb -text "Hello, world!" -command exit
pack .gomb
@V3. példa: interaktív hatványozó rutin
#!/opt/bin/wish -f
proc power {base p} {
set result 1
while {$p>0} {
set result [expr $result*$base]
set p [expr $p-1]
}
return $result
}
entry .base -width 6 -relief sunken -textvariable base
label .label1 -text "to the power"
entry .power -width 6 -relief sunken -textvariable power
label .label2 -text "is"
label .result -textvariable result
pack .base .label1 .power .label2 .result -side left -padx 1m -pady 2m
bind .base <Return> {set result [power $base $power]}
bind .power <Return> {set result [power $base $power]}
@V4. példa: menükezelés
#!/opt/bin/wish -f
frame .mbar -relief raised -bd 2
menubutton .mbar.ls -text "List files" -underline 0
menubutton .mbar.quit -text "Quit" -underline 0
listbox .e -relief raised -borderwidth 2 -yscrollcommand ".scroll set"
scrollbar .scroll -command ".e yview"
bind .mbar.ls <1> {
set result [exec ls]
foreach i $result {
.e insert end $i
}
}
bind .mbar.quit <1> {exit}
pack .mbar -fill x
pack .mbar.ls -side left
pack .mbar.quit -side right
pack .e -side left
pack .scroll -side right -fill y
@V5. példa: kiválasztógombok
#!/opt/bin/wish -f
set font times
radiobutton .times -text Times -variable font -value times -anchor w
radiobutton .courier -text Courier -variable font -value courier -anchor w
radiobutton .helvetica -text Helvetica -variable font -value helvetica -anchor w
radiobutton .symbol -text Symbol -variable font -value symbol -anchor w
bind .title <3> {.title configure -font *-$font-*}
pack .title .times .courier .helvetica .symbol -side top -fill x
@VEsemények
Néhány példa olyan lehetséges eseményekre, amelyekhez
valószínûleg utasításokat kapcsolhatunk:
<Button-1> A bal egérgomb lenyomása
<ButtonRelease-1> A bal egérgomb elengedése
<DoubleButton-1> A bal egérgomb dupla lenyomása
<Key-a> Az ""a" betû leütése
<Motion> Egérkurzor mozgatás a widget felett
<B1-Motion> Az egérkurzor mozgatása a bal gomb nyomvatartásával
<Any-Motion> Az egérkurzor mozgatása egy tetszôleges gomb nyomvatartásával